﻿using System;
using System.Collections.Generic;

namespace VietNamKey
{
	public static class VNStatic
	{
		public static List<string> NguyenAm  = new List<string>(new[]{"a", "ă", "â", "e", "ê", "i", "y", "o", "ô", "ơ", "u", "ư", "ai", "ao", "au", "ay", "âu", "ây", "eo", "êu", "ia", "iê", "yê", "iu", "oa", "oă", "oe", "oi", "ôi", "ơi", "ua", "uâ", "uê", "ui", "uô", "uơ", "uy", "ưa", "ưi", "ươ", "ưu", "oo", "ôô", "iêu", "yêu", "oai", "oay", "uây", "uôi", "uyê", "uyu", "ươi", "ươu", "uya", "oao", "oeo"});
		public static List<string> NguyenAmGiua = new List<string>(new[]{"ă", "â", "iê", "oă", "uâ", "uô", "oo", "ôô", "ươ", "uyê"});
		public static List<string> NguyenAmCuoi = new List<string>(new[]{"ai", "ao", "au", "ay", "âu", "ây", "eo", "êu", "ia", "iu", "oi", "ôi", "ơi", "ui", "ưa", "ưi", "ưu", "iêu", "uôi", "uyu", "ươi", "ươu", "oai", "oay", "uây", "uya", "oeo", "oao"});
		public static List<string> PhuAm  = new List<string>(new[]{"b", "c", "k", "qu", "d", "đ", "g", "h", "l", "m", "n", "p", "r", "s", "t", "v", "x", "ch", "gi", "gh", "kh", "nh", "ng", "ngh", "ph", "th", "tr"});
        public static List<string> PhuAmCuoi = new List<string>(new[]{"c", "ch", "m", "n", "ng", "nh", "p", "t"});
        public static List<string> SacNang = new List<string>(new[]{"c", "ch", "p", "t"});
        public static List<string> UNI = Encodings.Unicode.Value;
		public static List<string> a = GetRange("aăâ");
		public static List<string> o = GetRange("oôơ");
		public static List<string> e = GetRange("eê");
		public static List<string> u = GetRange("uư");
		public static List<string> uw = GetRange("ư");
        
        public static string[] SVowelUnsign = new[]{"ad", "uat",
													"as", "uac",
													"al", "uan",
													"az", "uang",
													"av", "uam",
													"khaj", "khuay",
													"aj", "oay",
													"ew", "oeo",
													"ed", "oet",
													"el", "oen",
													"ev", "oem",
													"iw", "ieu",
													"id", "iet",
													"is", "iec",
													"if", "iep",
													"il", "ien",
													"iz", "ieng",
													"iv", "iem",
													"ow", "oao",
													"oj", "oai",
													"od", "oat",
													"os", "oac",
													"of", "oap",
													"ol", "oan",
													"oz", "oang",
													"ov", "oam",
													"uw", "uou",
													"uj", "uoi",
													"ud", "uot",
													"ul", "uon",
													"uz", "uong",
													"uv", "uom",
													"uf", "uop",
													"us", "uoc",
													"yd", "uyet",
													"yl", "uyen"};
        public static string[] SVowel = new[]{	"ăd", "oăt",
												"ăs", "oăc",
												"ăl", "oăn",
												"ăz", "oăng",
												"ăv", "oăm",
												"ay", "ay",
												"aj", "oay",
												"ed", "oet",
												"el", "oen",
												"ev", "oem",
												"ew", "oeo",
												"id", "iêt",
												"is", "iêc",
												"if", "iêp",
												"il", "iên",
												"iz", "iêng",
												"iv", "iêm",
												"iw", "iêu",
												"od", "oat",
												"os", "oac",
												"of", "oap",
												"ol", "oan",
												"oz", "oang",
												"ov", "oam",
												"ow", "oao",
												"oj", "oai",
												"ud", "uôt",
												"us", "uôc",
												"ul", "uôn",
												"uz", "uông",
												"uv", "uôm",
												"uj", "uôi",
												"yl", "uyên",
												"yd", "uyêt",
												"ơd", "uơt",
												"ơl", "uơn",
												"ưd", "ươt",
												"ưs", "ươc",
												"ưf", "ươp",
												"ưl", "ươn",
												"ưz", "ương",
												"ưv", "ươm",
												"ưw", "ươu",
												"ưj", "ươi",
												"âd", "uât",
												"âl", "uân",
												"âz", "uâng",
												"ây", "ây",
												"âj", "uây"};
        
		public static string RemoveSign(string stext, out int sign)
		{
			for(int i = 0; i < stext.Length; i++)
			{
				int index = UNI.IndexOf(stext[i].ToString());
				sign = GetSignIndex(index);
				if(sign > 0)
				{
					char[] arr = stext.ToCharArray();
					arr[i] = UNI[index - sign][0];
					return new String(arr);
				}
			}
			sign = 0;
			return stext;
		}
		public static string RemoveSign(string stext)
		{
			int s;
			return RemoveSign(stext, out s);
		}
		public static int GetSignIndex(int index) { return index < 73 ? index % 6 : (index - 74) % 6; }
		public static int GetSignIndex(char ch) { return GetSignIndex(UNI.IndexOf(ch.ToString())); }
		
		
		/// <summary>
		/// Lấy danh sách các chữ có thể bỏ dấu mũ, móc được
		/// </summary>
		/// <param name="BeginChars">chữ thường a, o, u, e VD: "a" hoặc "aeo"</param>
		/// <returns>danh sách chữ dựa vào bảng mã đang chọn</returns>
		private static List<string> GetRange(string BeginChars)
		{
			List<string> result = new List<string>();
			for(int i = 0; i < BeginChars.Length; i++)
			{
				int bg = UNI.IndexOf(BeginChars[i].ToString());
				for(int j = 0; j < 6; j++)
					result.AddRange(new string[]{UNI[bg + j], UNI[bg + 74 + j]});
			}
			return result;
		}
	}
}
